import axios from "axios"
import errorCode from '@/constants/errorCode'

//设置请求头
/**
 * 在请求中 (如POST 或 PUT)，Content-Type字段用于客户端告诉服务器实际发送的数据类型。当你发送一个HTTP的POST请求时，需要设置请求头中的Content-Type字段，告诉服务端你发送的数据是什么类型的。
 */
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 10000
})

//请求拦截器配置
service.interceptors.request.use(
  (config) => {
    //在发送请求之前做些什么
    return config;
  },
  (err) => {
    //对请求错误做些什么
    return Promise.reject(err);
  });

//响应拦截器配置
service.interceptors.response.use(
  response => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    //获取状态码
    const code = response.data?.code || 200,
      message = errorCode[code] || response.data?.msg || errorCode['default'];
    // 二进制数据则直接返回
    if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
      return response.data
    }
    //其它格式数据则进行解析
    if (code !== 200) {
      //提示错误信息
      return Promise.reject(message);
    } else {
      return response.data
    }
  },
  err => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(err?.message);
  });


/**
 * GET请求
 * @param { String } url 请求路径 
 * @param { any } params 请求参数 
 * @returns 
 */
export const getAxios = (url, params) => {
  return service.get(url, {
    params: params,
  })
}


/**
 * POST请求
 * @param { String } url 请求路径 
 * @param { any } params 请求参数 
 * @returns 
 */
export const postAxios = (url, params) => {
  return service.post(url, params);
}

/**
 * PUT请求
 * @param { String } url 请求路径
 * @param { any } params 请求参数 
 * @returns 
 */
export const putAxios = (url, params) => {
  return service.put(url, params);
}

/**
 * DELETE请求
 * @param { String } url 请求路径 
 * @param { any } params 请求参数 
 */
export const deleteAxios = (url, params) => {
  return service.delete(url, {
    params: params
  });
}